package net.zjitc.config;

import com.alibaba.druid.pool.DruidDataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;

import javax.sql.DataSource;

@Configuration // 声明当前类为配置类 配置类中包含有bean的定义
@PropertySource("classpath:jdbc.properties") // 声明当前类中使用的properties文件位置 加载外部文件
@MapperScan("net.zjitc.mapper") // 扫描mapper接口 扫描mapper接口所在的包  自动创建接口实现类对象 自动注入到dao service controller层
@ComponentScan("net.zjitc.service") // 扫描指定包下的所有 @Component、@Service、@Repository 和 @Controller 注解的类  ：自动发现并管理服务层组件
@EnableTransactionManagement // 开启事务管理 允许在服务层方法上使用 @Transactional 注解来管理事务

public class MyBatisConfig {

    @Value("${jdbc.driver}")
    private String driver;
    @Value("${jdbc.url}")
    private String url;
    @Value("${jdbc.uname}")
    private String username;
    @Value("${jdbc.password}")
    private String password;
    //创建并配置数据源对象
    @Bean
    public DataSource dataSource(){
        DruidDataSource dataSource=new DruidDataSource();
        dataSource.setDriverClassName(driver);
        dataSource.setUrl(url);
        dataSource.setUsername(username);
        dataSource.setPassword(password);
        return dataSource;
    }
    //创建并配置 SqlSessionFactory 对象

    @Bean
    public SqlSessionFactory sqlSessionFactory(DataSource dataSource)throws Exception{
        //创建 SqlSessionFactoryBean 对象
        SqlSessionFactoryBean bean=new SqlSessionFactoryBean();
        //设置数据源
        bean.setDataSource(dataSource);
        //设置类型别名包
        bean.setTypeAliasesPackage("net.zjitc.pojo");
        //配置 MyBatis 的驼峰命名规则
        bean.getObject().getConfiguration().setMapUnderscoreToCamelCase(true);
        return bean.getObject();
    }
    //创建并配置事务管理器对象
    @Bean
    public DataSourceTransactionManager transactionManager(DataSource dataSource){
        return new DataSourceTransactionManager(dataSource);
    }

}
